<?php
namespace app\api\controller\v1;

use app\admin\model\City as CityModel;
use app\common\controller\Api;
use InvalidArgumentException;

class City extends Api
{

    protected $noNeedLogin=['lists','read'];
    protected $noNeedRight = ['lists','read'];


    // 获取城市列表的方法
    public function lists()
    {
        // 获取请求参数
        $q = input('get.q', '');  // 默认空字符串，如果没有提供 'q' 参数
        $page = input('get.page', 1);  // 默认第一页，如果没有提供 'page' 参数
        $pagesize=input('get.pagesize', 10);
        $city_id=input('get.city_id', 2);

        // 实例化 Api 模块的城市模型
        $cityModel = new CityModel();

        // 构建查询条件
        $where["status"] = ['eq',1];  // 假设状态字段是 status，值为1表示有效城市"];
        $where["level"] = ['eq',2];
        if($city_id){
            $where["id"] = ['eq',$city_id];
        }
        if ($q) {
            $where['cityname'] = ['like', '%' . $q . '%'];  // 假设城市名称字段是 city_name
        }

        // 使用模型进行数据查询，加入条件并分页
        $citys = $cityModel->where($where)
            ->page($page, $pagesize)  // 每页显示10条记录
            ->select();

        if ($citys) {
            // 如果查询到城市信息，返回成功响应并携带城市数据
            return $this->success('获取城市列表成功', $citys);
        } else {
            // 如果未查询到，返回相应的错误提示
            return $this->error('暂无城市信息');
        }
    }


    // 获取单个城市信息的方法，接收用户ID作为参数
    public function read($id)
    {
        // 实例化用户模型
        $cityModel = new CityModel();
        // 根据传入的ID查询单个城市信息，可添加更多验证逻辑确保ID合法性等
        $city = $cityModel->where('id', $id)->find();
        if ($city) {
            return $this->success('获取城市信息成功', $city);
        } else {
            return $this->error('未找到对应ID的城市');
        }
    }

    //根据经纬度获取城市信息
    public function getCityByLocation(){

        $lat=input('lat','108.35532379150390');
        $lng=input('lng','22.82912254333496');
        if(!$lat || !$lng){
            return $this->error('经纬度参数错误');
        }
        //利用百度地图API获取城市信息
        if ($lat < 3.86 || $lat > 53.55 || $lng < 73.66 || $lng > 135.05) {
            $lat=input('lat','108.35532379150390');
            $lng=input('lng','22.82912254333496');
        }

        $ak = 'aBIfRNb8MimBirL5RrjJn1WKDGs0jVQE'; // 服务端密钥
        $url = sprintf(
            'https://api.map.baidu.com/reverse_geocoding/v3/?ak=%s&output=json&coordtype=wgs84ll&location=%.6f,%.6f',
            urlencode($ak),
            $lat,
            $lng
        );

        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => true,  // 生产环境应启用SSL验证
            CURLOPT_TIMEOUT => 5,
            CURLOPT_HTTPHEADER => [
                'Accept: application/json'
            ]
        ]);

        $result = curl_exec($ch);
        $error = curl_error($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if ($result) {
            $data = json_decode($result, true);
        }
        if(isset($data['result']['addressComponent']['city'])){
            $city=$data['result']['addressComponent']['city'];
            $cityModel = new CityModel();
            $where["status"] = ['eq',1];  // 假设状态字段是 status，值为1表示有效城市"];
            $where["level"] = ['eq',2];
            $where["name"] = ['like', '%' . $city . '%'];
            $citys = $cityModel->where($where)->select();
            if(!$citys){
                $where["name"] = ['like', '%南宁市%'];
                $citys = $cityModel->where($where)->select();
            }
            if ($citys) {
                return $this->success('获取城市列表成功', $citys);
            } else {
                return $this->error('暂无城市信息');
            }
        }

    }

    public function getAddressByLocation(){

        $lat=input('lat','108.35532379150390');
        $lng=input('lng','22.82912254333496');
        if(!$lat || !$lng){
            return $this->error('经纬度参数错误');
        }
        //利用百度地图API获取城市信息
        if ($lat < 3.86 || $lat > 53.55 || $lng < 73.66 || $lng > 135.05) {
            $lat=input('lat','108.35532379150390');
            $lng=input('lng','22.82912254333496');
        }

        $ak = 'aBIfRNb8MimBirL5RrjJn1WKDGs0jVQE'; // 服务端密钥
        $url = sprintf(
            'https://api.map.baidu.com/reverse_geocoding/v3/?ak=%s&output=json&coordtype=wgs84ll&location=%.6f,%.6f',
            urlencode($ak),
            $lat,
            $lng
        );

        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => true,  // 生产环境应启用SSL验证
            CURLOPT_TIMEOUT => 5,
            CURLOPT_HTTPHEADER => [
                'Accept: application/json'
            ]
        ]);

        $result = curl_exec($ch);
        $error = curl_error($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if ($result) {
            $data = json_decode($result, true);
        }
        $result=$data['result'];
        if ($result) {
            return $this->success('获取当前经纬度地址成功', $result);
        } else {
            return $this->error('暂无城市信息');
        }

    }
}